當初會知道這個比賽是我一個社團朋友傳給我的,稍微猶豫了一兩天就決定入坑了,在過程雖想著30天30篇文實在是一個馬拉松阿,但對於我這麼一個從沒在網路上寫過教學文的假程式設計師,既是一個不一樣的體驗,又能稍微跨出一點舒適圈,把自己拙劣的理解整理成30篇文章,似乎是一個難得的機會,所以還是決定參加了。
當然還是可以輕鬆寫得過且過的寫XD,但是既然參加了,不認真寫對不起自己阿,於是我從11月開始就偷跑了(?為了能夠好好整理自己的思緒,好好思考自己所學,並在寫文章過程中讓自己的基礎更加穩固。從十一月就開始貢獻時間跑馬拉松的我,犧牲了一些娛樂時間,也熬了一些夜,看起來就像是個很魯的技術宅一樣(事實也是如此),真的希望能夠在過程中能夠有讓人出乎意料的驚喜或是進步,不管是在技術上,表達能力上,或是社群參與度上,我一直以這個目標努力著。
好拉,只是充字數,為了讓我的草稿多一些字看起來比較爽XD,我這30天的系列文之所以取名叫python雜談,是因為真的很雜亂~而且某種程度可能鑽牛角尖XD,一來我沒有什麼特別深入的技術,比如說那些機器學習什麼的,可以這樣一直說嘴到30天,二來也不想只寫很基礎的python教學,因為看起來已經有人寫很多了,再寫好像也沒意義,再來我也想稍微寫難一點,稍微挑戰自己一下,雖然會花時間,但反正志在參加嘛,太難寫不完就放棄XD,所以這個系列文可能並不適合完全初學的人閱讀,而是一些稍微寫過碰過python的人來看,因為我就是以我自己稍微寫過python的經驗來做一些心得與探討,好吧就這樣,希望大家發現不足之處請用力鞭我。
阿阿然後我主要是用ubuntu14.04LTS、python3.4.3的環境來做一些範例的demo,但有些雜談會用python2.7來做demo,在過程中我會指明我用python2還是python3來跑,而至於那些windows使用者,demo結果跟你們不符我也沒辦法(逃),因為沒時間再去用windows測嘛,盡力了,好開始。
今天我要稍微講一下python語言的一個特性——動態型別(dynamic type)特性以及他的實現方法,首先什麼是動態型別呢?就我的理解,靜態型別(static type)的語言在使用一個變數時,必須事先宣告這個變數的data type,而動態型別則不需要,從下面一個很簡單的變數相加範例就可以看出其中差別。
/* C++ (static type language) */
int a = 1, b = 2;
int sum=a+b;
string s = "I'm the example";
/* python (dynamic type language) */
a = 1
b = 1
sum = a+b
s = "I'm the example"
很明顯的差別對吧?當我用C++宣告一個變數的時候,因為C++是靜態型別語言,所以必須明定這個變數的型別(範例中的int和string)並存取相應型別的資料,而python不需要宣告型別就可以直接存取任何型別的資料,而且在重新賦值的時候,可以存取和原型別不同的資料,比如說:
/* C++ (static type language) */
int a ;
a = 1;
a = "I'm the example"; // 會出現 compile error
/* python (dynamic type language) */
a = 1
a = "I'm the example" // It's OK
而同時靜態型別與動態型別另一個明顯的區別就是,靜態型別語言在程式的編譯(compiling)時期就會做變數的型別檢查,因此需要事先做出型別宣告讓編譯器確定現在這個變數的型別為何,而動態型別語言是在執行時期做型別檢查,藉著存在變數裡的內容的型態來確定這個變數的型別。
通常動態型別最明顯的優點就是,省去了宣告型別的程式碼,想要用的時候就可以直接用,可以大大提升程式碼的簡潔程度,進而降低開發成本,但是不需要初始化的缺點就是如果在使用變數的過程中不小心打錯名字,python就會把他視為一個全新的變數,而不會報錯,但會讓程式出現自己不預期的結果,而我想這應該就只能細心一點,或是用一些具有"名稱自動補全"功能的文字編輯器來寫程式吧。